import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import lagrange

# 生成虚拟数据集
# 原始数据点
x = np.array([0, 1, 2, 3, 4, 5, 6])
y = np.array([1, 2, 0, 5, 3, 4, 2])

# 创建拉格朗日插值多项式
poly = lagrange(x, y)

# 生成更密集的x，用于绘制平滑的插值曲线
x_dense = np.linspace(min(x), max(x), 500)
y_dense = poly(x_dense)

# 生成测试数据，模拟"真实值" (在这个案例中, 假设我们知道真实值)
y_true = np.sin(x_dense) + 2  # 真实值可以人为定义为一个复杂的函数

# 计算插值误差
error = y_true - y_dense

# 绘制插值曲线和误差图

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 10), dpi=100)

# 1. 原始数据点与插值曲线图
ax1.plot(x_dense, y_dense, label='Lagrange Interpolation', color='blue', linewidth=2)
ax1.scatter(x, y, color='red', label='Original Data Points', zorder=5)
ax1.plot(x_dense, y_true, label='True Values (sin(x) + 2)', color='green', linestyle='--', linewidth=2)

ax1.set_title('Lagrange Interpolation and Original Data')
ax1.set_xlabel('x')
ax1.set_ylabel('y')
ax1.legend()
ax1.grid(True)

# 2. 插值误差图
ax2.plot(x_dense, error, label='Interpolation Error', color='purple', linewidth=2)
ax2.axhline(0, color='black', linestyle='--', linewidth=1)
ax2.set_title('Interpolation Error (True Value - Interpolated Value)')
ax2.set_xlabel('x')
ax2.set_ylabel('Error')
ax2.legend()
ax2.grid(True)

plt.tight_layout()
plt.show()